package com.yidu.t299.service.twj.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.yidu.t299.contant.CommonConstant;
import com.yidu.t299.dao.twj.SysUserMapper;
import com.yidu.t299.domain.twj.SysRight;
import com.yidu.t299.domain.twj.SysUser;
import com.yidu.t299.domain.twj.UserInfo;
import com.yidu.t299.service.twj.SysRightBiz;
import com.yidu.t299.service.twj.SysUserBiz;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author twj
 * @version 1.0.0
 */

@Service
@Transactional
public class SysUserBizImpl implements SysUserBiz {
    @Autowired
    private SysUserMapper sysUserMapper;

    @Autowired
    private SysRightBiz sysRightBiz;

    /**
     * 登录
     * 1.根据用户提供用户名（用户标识），到数据库中查询相关记录
     * 2.判断查询到的用户是否为null
     * 3.如果为null，表示当前用户提供的用户名有误
     * 4.如果不为null，根据用户提供的密码（用户凭证）比对数据库中存储的密码
     * 5.如果不一致表示用户提供的密码有误
     * 6.如果一致返回UserInfo对象
     */
    @Override
    public UserInfo login(String usrName, String usrPassword) {
        //校验用户名是否存在
        SysUser sysUser = selectByUsrName(usrName);
        if(sysUser != null){
            if(usrPassword.equals(sysUser.getUsrPassword())){
                UserInfo userInfo = new UserInfo();
                //spring中提供了一个工具类BeanUtils，提供属性值复制功能
                //copyProperties(源对象, 目标对象)
                //要求：属性名称保持一致
                BeanUtils.copyProperties(sysUser, userInfo);
                //查询当前用户所拥有的全部权限
                List<SysRight> sysRightList = sysRightBiz.findByUserId(userInfo.getUsrRoleId());
                userInfo.setSysRightList(sysRightList);
                return userInfo;
            }
        }
        return null;
    }

    /**
     * 根据主键删除用户信息(实际上是修改flag字段的值，不能直接删除信息)
     *
     * @param usrId 用户编号
     * @return 影响的行数(1 : 成功)
     */
    @Override
    public int deleteByPrimaryKey(Integer usrId) {
        return sysUserMapper.deleteByPrimaryKey(usrId);
    }

    /**
     * 根据主键批量删除用户信息(实际上是修改flag字段的值，不能直接删除信息)
     *
     * @param array 用户编号数组
     * @return 影响的行数(1 : 成功)
     */
    @Override
    public int deleteBatch(Integer[] array) {
        return sysUserMapper.deleteBatch(array);
    }

    /**
     * 添加用户信息
     *
     * @param sysUser 用户对象
     */
    @Override
    public void insert(SysUser sysUser) {
        //校验用户名是否存在，存在则添加
        SysUser su = selectByUsrName(sysUser.getUsrName());
        //后台校验，保证安全性，防止第三方工具注册（PostMan）
        if (su == null) {
            sysUser.setUsrPassword(CommonConstant.PASSWORD_DEFAULT);
            sysUserMapper.insert(sysUser);
        }
    }

    /**
     * 根据主键查询用户信息
     *
     * @param usrId 用户编号
     * @return 用户对象
     */
    @Override
    public SysUser selectByPrimaryKey(Integer usrId) {
        return sysUserMapper.selectByPrimaryKey(usrId);
    }

    /**
     * 根据用户名查询
     * 1、注册：用户名查重
     * 2、用户登录（精细化提示使用，先判断用户名，再判断密码）
     *
     * @param usrName 用户名
     * @return 用户对象
     */
    @Override
    public SysUser selectByUsrName(String usrName) {
        return sysUserMapper.selectByUsrName(usrName);
    }

    /**
     * 根据所给属性值来修改其字段值
     *
     * @param sysUser 用户对象
     */
    @Override
    public void update(SysUser sysUser) {
        //校验用户名是否存在，存在则修改
        SysUser su = selectByUsrName(sysUser.getUsrName());
        if (su != null) {
            sysUserMapper.update(sysUser);
        }
    }

    /**
     * 批量查询
     *
     * @param sysUser 用户对象
     * @return 用户对象集合
     */
    @Override
    public List<SysUser> select(SysUser sysUser) {
        return sysUserMapper.select(sysUser);
    }

    /**
     * 同步案例中：分页条件查询，我们反馈的是PageInfo对象
     * 但是PageHelper建议尽量不要跨层，以便后期维护。
     * 比如：后期我们通过Mybatis-plus替换mybatis，那么如果跨层，就需要多个地方更改。
     *
     * @param pageNum 页码
     * @param pageSize 每页行数
     * @param sysUser 用户对象
     */
    @Override
    public Map<String, Object> findPage(Integer pageNum, Integer pageSize, SysUser sysUser) {
        //分页业务实现
        PageHelper.startPage(pageNum, pageSize);

        List<SysUser> list = sysUserMapper.select(sysUser);
        PageInfo<SysUser> pageInfo = new PageInfo<>(list);

        Map<String, Object> pageMap = new HashMap<>();
        pageMap.put(CommonConstant.PAGE_LIST, list);
        pageMap.put(CommonConstant.PAGE_TOTAL, pageInfo.getTotal());

        return pageMap;
    }
}
